package com.wenx.v3system.modular.cloud.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.wenx.base.rest.BaseRestService;
import com.wenx.v3system.modular.cloud.domain.dto.SysRoleDto;
import com.wenx.v3system.modular.cloud.domain.po.SysRole;
import com.wenx.v3system.modular.cloud.domain.query.SysRoleQuery;

import java.util.List;
import java.util.Set;

/**
 * 系统角色服务接口
 * 基于Enhanced RBAC权限模型
 * 支持角色层次结构和权限继承
 *
 * @author wenx
 * @since 1.0.0
 */
public interface SysRoleRestService extends IService<SysRole>, BaseRestService<SysRoleDto, SysRoleQuery> {

    /**
     * 获取所有角色列表（带数据权限控制）
     */
    List<SysRole> all();

    /**
     * 获取用户的所有角色
     *
     * @param userId 用户ID
     * @return 角色列表
     */
    List<SysRoleDto> getUserRoles(Long userId);

    /**
     * 获取角色的权限列表
     *
     * @param roleId 角色ID
     * @return 权限编码集合
     */
    Set<String> getRolePermissions(Long roleId);

    /**
     * 为角色分配权限（智能识别数据类型）
     *
     * @param roleId 角色ID
     * @param permissionData 权限数据（可以是权限ID列表或权限代码列表）
     */
    void assignPermissionsToRoleByData(Long roleId, Object permissionData);

    /**
     * 为角色分配权限
     *
     * @param roleId 角色ID
     * @param permissionIds 权限ID列表
     */
    void assignPermissionsToRole(Long roleId, List<Long> permissionIds);

    /**
     * 为角色分配权限（使用权限代码）
     *
     * @param roleId 角色ID
     * @param permissionCodes 权限代码列表
     */
    void assignPermissionsByCode(Long roleId, List<String> permissionCodes);

    /**
     * 移除角色的权限（使用权限代码）
     *
     * @param roleId 角色ID
     * @param permissionCodes 权限代码列表
     */
    void removeRolePermissionsByCode(Long roleId, List<String> permissionCodes);

    /**
     * 移除角色的权限
     *
     * @param roleId 角色ID
     * @param permissionIds 权限ID列表
     */
    void removeRolePermissions(Long roleId, List<Long> permissionIds);

    /**
     * 检查角色是否拥有指定权限
     *
     * @param roleId 角色ID
     * @param permission 权限编码
     * @return 是否拥有权限
     */
    boolean hasPermission(Long roleId, String permission);

    /**
     * 获取角色的子角色列表
     *
     * @param parentRoleId 父角色ID
     * @return 子角色列表
     */
    List<SysRoleDto> getChildRoles(Long parentRoleId);

    /**
     * 启用角色
     *
     * @param roleId 角色ID
     */
    void enableRole(Long roleId);

    /**
     * 禁用角色
     *
     * @param roleId 角色ID
     */
    void disableRole(Long roleId);

    /**
     * 检查角色编码是否存在
     *
     * @param code 角色编码
     * @param excludeId 排除的角色ID（用于更新时检查）
     * @return 是否存在
     */
    boolean existsByCode(String code, Long excludeId);

    /**
     * 获取角色的菜单权限
     *
     * @param roleId 角色ID
     * @return 菜单ID列表
     */
    List<Long> getRoleMenus(Long roleId);

    /**
     * 为角色分配菜单权限
     *
     * @param roleId 角色ID
     * @param menuIds 菜单ID列表
     */
    void assignMenusToRole(Long roleId, List<Long> menuIds);
}
